#include <mips/regdef.h>

	.text

	.globl	mcm

mcm:
	# Armar el Stack Frame:

	subu	sp, sp, 40		# Stack Size  = 16 (SRA) + 8(LTVA) + 16 (ABA) = 40
	sw		ra, 32(sp)
	sw		$fp, 28(sp)
	.cprestore 24
	move	$fp, sp

	# Guardar argumentos en ABA de función caller:

	sw		a0, 40($fp)		# m
	sw		a1, 44($fp)		# n

	# Cuerpo del programa:
							# t0 <-> numerador y t1 <-> denominador
	mulo	t0, a0, a1		# t0 <- m * n
	sw		t0, 16($fp)		# guardar numerador en LTVA
							# t1 <-> denominador
	la		t9, mcd
	jalr	t9				# llamar a la funcion, los argumentos ya estan en a0 y a1
	move	t1, v0			# recuperar el valor de retorno
	sw		t1, 20($fp)		# guardar denominador en LTVA

	lw 		t0, 16($fp)

	div		v0, t0, t1		# return numerador/denominador

	# Destruir el Stack Frame:

	move	sp, $fp
	lw		ra, 32(sp)
	lw		$fp, 28(sp)
	addu	sp, sp, 40
	j		ra

############################################################################################

	.globl	mcd

mcd:
	# Armar el Stack Frame:

	subu	sp, sp, 40		# Stack Size  = 16 (SRA) + 8(LTVA) + 16 (ABA) = 40
	sw		ra, 32(sp)
	sw		$fp, 28(sp)
	.cprestore 24
	move	$fp, sp

	# Guardar argumentos en ABA de función caller:

	sw		a0, 40($fp)		# m
	sw		a1, 44($fp)		# n

	# Cuerpo del programa:
							# t0 <-> m y t1 <-> n
	lw		t0, 40($fp)		# t0 <- m
	lw		t1, 44($fp)		# t1 <- n

	bnez	t1, _else		# if(n!=0)
	move	v0, t0 			# return m
	b 		salir

_else:
							# t2 <-> r
	remu	t2, t0, t1		# t2 <- m mod n
	sw		t2, 16($fp)		# guardar r en LTVA

	move 	a0, t1			# colocar nuevos parametros n y r
	move 	a1, t2
	la 		t9, mcd
	jalr	t9

salir:
	# Destruir el Stack Frame:

	move	sp, $fp
	lw		ra, 32(sp)
	lw		$fp, 28(sp)
	addu	sp, sp, 40
	j		ra
